/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package lexico10.Controller;
import java.util.*;
import lexico10.Model.Token;
import lexico10.Model.Automato;
/**
 *
 * @author PedroSkype
 */
public class Compilador {

public ArrayList ListaDeToken = new ArrayList();
public ArrayList ListaDeErro = new ArrayList();
//ArrayList ListaDeEstadosFinais = new ArrayList();
String LexemaAtual = new String();
String Codigo= new String();
Token Last = new Token();
String TipoToken = new String();

    public void setLexemaAtual(String LexemaAtual) {
        this.LexemaAtual = LexemaAtual;
        
    }

    public String getCodigo() {
        return Codigo;
    }

    public void setCodigo(String Codigo) {
        this.Codigo = Codigo;
    }

    public Token getLast() {
        return Last;
    }

    public void setLast(Token Last) {
        this.Last = Last;
    }

    public String getTipoToken() {
        return TipoToken;
    }

    public void setTipoToken(String TipoToken) {
        this.TipoToken = TipoToken;
    }

    public Compilador() {
    }

    public String getLexemaAtual() {
        return LexemaAtual;
    }

    public ArrayList getListaDeErro() {
        return ListaDeErro;
    }

    public void setLastToken(Token last){
       this.Last = last;
    }

    public Token getLastToken(){
       return this.Last;
    }

    public ArrayList getListaDeToken() {
        return ListaDeToken;
    }


public void incrementaListaToken (Token token){
ListaDeToken.add(token);
}

public void incrementaListaErro (Token token){
ListaDeErro.add(token);
}

boolean checaPR(String Ident){
if(Ident.equals("algoritmo") || Ident.equals("variaveis")  || Ident.equals("constantes") || Ident.equals("registro")
|| Ident.equals("funcao") || Ident.equals("retorno") || Ident.equals("vazio") || Ident.equals("se")
|| Ident.equals("senao") || Ident.equals("enquanto") || Ident.equals("para") || Ident.equals("leia")
|| Ident.equals("escreva") || Ident.equals("inteiro") || Ident.equals("real") || Ident.equals("booleano")
|| Ident.equals("char") || Ident.equals("cadeia") || Ident.equals("verdadeiro") || Ident.equals("falso"))

{
    return true;}
else
    return false;
}


//METODO QUE VAI IDENTIFICAR O TOKEN E ADICIONAR NA LISTA

public boolean identificaTipo(Automato aut/*int EstadoFinal, int posin, int posfin*/){  //EXECUTA AUTOMATO FABIO

    System.out.println("entrou Id Tipo" + aut.getEstadoAtual());
    System.out.println("inicial " + aut.getPosInicialCadeia() + " final " + aut.getPosFinalCadeia() );
   // System.out.println("código: " + this.getCodigo());

    System.out.println("lexAtual:  "+getLexemaAtual());
    System.out.println("...\n...");

    if(aut.getEstadoAtual() == 2 || aut.getEstadoAtual() == 6 || aut.getEstadoAtual() == 9){
    setLexemaAtual(this.getCodigo().substring(aut.getPosInicialCadeia(), aut.getPosFinalCadeia()));
//    }else if(aut.getEstadoAtual() == 25){
//    aut.setPosInicialCadeia(aut.getPosInicialCadeia()+1);
    }
    else{
    setLexemaAtual(this.getCodigo().substring(aut.getPosInicialCadeia(), aut.getPosFinalCadeia()+1));
    }


switch (aut.getEstadoAtual()){



    case 2: {
    TipoToken = "Identificador";
    if(this.checaPR(LexemaAtual)){
        TipoToken = "Palavra Reservada";}
break;
    } //fehca case 2

    case 4: {
    TipoToken = "Erro_ID";
break;
    }//fehca case 4

    case 6: {
    TipoToken = "Num_Int";
break;
    }//fehca case 6

    case 9: {
    TipoToken = "Num_Float";
break;
    }//fehca case 9

    case 11: {
    TipoToken = "Erro_DIGITO";
break;
    }//fehca case 11

    case 13: {
    TipoToken = "Cadeia_constante";
break;
    }//fehca case 13

    case 14: {
    TipoToken = "Erro_CADEIA";
break;
    }//fehca case 14

    case 17: {
    TipoToken = "Caractere_Constante";
break;
    }//fehca case 17

    case 18: {
    TipoToken = "Erro_CHAR";
break;
    }//fehca case 18

    case 22: {
    TipoToken = "Coment_Bloco";
break;
    }//fehca case 22

    case 23: {
    TipoToken = "Coment_Linha";
break;
    }//fehca case 23

    case 24: {
    TipoToken = "Coment_Linha";
break;
    }//fehca case 24

    case 25: {
    TipoToken = "Op_Duplo";
break;
    }//fehca case 25

    case 26: {
    TipoToken = "Op_Simples";
break;
    }//fehca case 26

    case 28: {
    TipoToken = "Op_Diferente";
break;
    }//fehca case 28

    case 30: {
    TipoToken = "Op_OR";
break;
    }//fehca case 30

    case 32: {
    TipoToken = "Op_AND";
break;
    }//fehca case 32

    case 34: {
    TipoToken = "Delimitador";
break;
    }//fehca case 33

    case 35: {
    TipoToken = "Erro_OP ou Erro_SIMBOLO";
break;
    }//fehca case 35

    default: {
    TipoToken = "ErroDEFAULT";

    }//fehca case default


}//fecha switch


     Token tokenAtual = new Token(aut.getPosInicialCadeia(), aut.getPosFinalCadeia()+1, LexemaAtual, TipoToken);
     setLastToken(tokenAtual);


    if(TipoToken.equals("Erro")){
           incrementaListaErro(tokenAtual);
           return false;
    } else {
           incrementaListaToken(tokenAtual);
           return true;
    }

}

public String preprocessamento(String codigo){
    
String preP = new String();    
String auxE = new String();
String auxD = new String();
char auxOn;


codigo = codigo.concat(" ");
int a = 0;
auxD = codigo;
auxOn = codigo.charAt(a);
    System.out.println("codigo " + codigo);
while(a<auxD.length()){
    System.out.println("auxOn agora? " + auxOn);
switch (auxOn){

        case '/':{
        auxE=auxE.concat(auxD.substring(a, a+1));
        a++;
        auxOn = codigo.charAt(a);
            if(!(auxOn =='/' || auxOn == '*')){
            auxE=auxE.concat(" " + auxD.substring(a, a+1));
            a++;
            } else {
            auxE=auxE.concat(auxD.substring(a, a+1) + " ");
            a++;
            }//FECHA ELSE
break;
        } //FECHA CASE '/'

        case '+':{
            System.out.println("entrou no +\n");
        auxE=auxE.concat(auxD.substring(a, a+1));
        a++;
        auxOn = codigo.charAt(a);
            if(!(auxOn == '+')){
            auxE=auxE.concat(" " + auxD.substring(a, a+1));
                System.out.println("formando: "+auxE);
                System.out.println("atualPos " + auxD.substring(a, a+1));
            a++;
                System.out.println("proximaPos: " + auxD.substring(a, a+1));
            } else {
            auxE=auxE.concat(auxD.substring(a, a+1) + " ");
            a++;
            }//FECHA ELSE
break;
        } //FECHA CASE '//'

        case '-':{System.out.println("aqui?\n");
        auxE=auxE.concat(auxD.substring(a, a+1));
        a++;
        auxOn = codigo.charAt(a);
            if(!(auxOn =='-')){
            auxE=auxE.concat(" " + auxD.substring(a, a+1));
            a++;
            } else {
            auxE=auxE.concat(auxD.substring(a, a+1) + " ");
            a++;
            }//FECHA ELSE
break;
        } //FECHA CASE '--'

        case '>':{
        auxE=auxE.concat(auxD.substring(a, a+1));
        a++;
        auxOn = codigo.charAt(a);
            if(!(auxOn == '=')){
            auxE=auxE.concat(" " + auxD.substring(a, a+1));
            a++; System.out.println("IF");
            } else {
            auxE=auxE.concat(" " + auxD.substring(a, a+1));
            a++;
                System.out.println("ELSE");
            }//FECHA ELSE
break;
        } //FECHA CASE '>='

        case '<':{
        auxE=auxE.concat(auxD.substring(a, a+1));
        a++;
        auxOn = codigo.charAt(a);
            if(!(auxOn =='=')){
            auxE=auxE.concat(" " + auxD.substring(a, a+1));
            a++;
            } else {
            auxE=auxE.concat(" " + auxD.substring(a, a+1));
            a++;
            }//FECHA ELSE
break;
        } //FECHA CASE '<='
        case '=':{
        auxE=auxE.concat(auxD.substring(a, a+1));
        a++;
        auxOn = codigo.charAt(a);
            if(!(auxOn == '=')){
            auxE=auxE.concat(" " + auxD.substring(a, a+1) + " " ); //ESCOLHER ESPAÇO ANTES OU DEPOIS
            a++;
            } else {
            auxE=auxE.concat(auxD.substring(a, a+1) + " ");
            a++;
            }//FECHA ELSE
break;
        } //FECHA CASE '=='

        case '*':{
        auxE=auxE.concat(auxD.substring(a, a+1));
        a++;
        auxOn = codigo.charAt(a);
            if(!(auxOn =='/')){
            auxE=auxE.concat(" " + auxD.substring(a, a+1)); //ESCOLHER ESPAÇO ANTES OU DEPOIS
            a++;
            } else {
            auxE=auxE.concat(auxD.substring(a, a+1) + " ");
            a++;
            }//FECHA ELSE
break;
        } //FECHA CASE '*/'

        case '!':{
        auxE=auxE.concat(auxD.substring(a, a+1));
        a++;
        auxOn = codigo.charAt(a);
            if(!(auxOn =='=')){
            auxE=auxE.concat(" ");  //ESCOLHER ESPAÇO ANTES OU DEPOIS
          //  a++;
            } else {
            auxE=auxE.concat(auxD.substring(a, a+1) + " ");
            a++;
            }//FECHA ELSE
break;
        } //FECHA CASE '*/'

    case '&':{
        auxE=auxE.concat(auxD.substring(a, a+1));
        a++;
        auxOn = codigo.charAt(a);
            if(!(auxOn =='&')){
            auxE=auxE.concat(" " + auxD.substring(a, a+1)); //ESCOLHER ESPAÇO ANTES OU DEPOIS
            a++;
            } else {
            auxE=auxE.concat(auxD.substring(a, a+1) + " ");
            a++;
            }//FECHA ELSE
break;
        } //FECHA CASE '&&'

        case '|':{
        auxE=auxE.concat(auxD.substring(a, a+1));
        a++;
        auxOn = codigo.charAt(a);
            if(!(auxOn =='|')){
            auxE=auxE.concat(" " + auxD.substring(a, a+1)); //ESCOLHER ESPAÇO ANTES OU DEPOIS
            a++;
            } else {
            auxE=auxE.concat(auxD.substring(a, a+1) + " ");
            a++;
            }//FECHA ELSE
break;
        } //FECHA CASE '||'

        case '.':{
            //checa se o anterior é numero
            auxOn = codigo.charAt(a-1);
            System.out.println("auxON do ponto " + auxOn);

            if((auxOn == '0' || auxOn == '1' || auxOn == '2' || auxOn == '3' || auxOn == '4' || auxOn == '5' ||
            auxOn == '6' || auxOn == '7' || auxOn == '8' || auxOn == '9')) {
                auxOn = codigo.charAt(a+1);
                if((auxOn == '0' || auxOn == '1' || auxOn == '2' || auxOn == '3' || auxOn == '4' || auxOn == '5' ||
            auxOn == '6' || auxOn == '7' || auxOn == '8' || auxOn == '9')){

                auxE=auxE.concat(auxD.substring(a, a+1)); //ESCOLHER ESPAÇO ANTES OU DEPOIS
                a++;
break;
                }
//else {
//            auxE=auxE.concat(" " + auxD.substring(a, a+1)); //ESCOLHER ESPAÇO ANTES OU DEPOIS
//            a++;
            }//FECHA IF
            auxE=auxE.concat(" " + auxD.substring(a, a+1) + " "); //ESCOLHER ESPAÇO ANTES OU DEPOIS
            a++;

break;
        } //FECHA CASE '||'
//###################################################################
//###################################################################
//###################################################################

        case ';':{
        auxE=auxE.concat(auxD.substring(a, a+1) + " ");
        a++;
        auxOn = codigo.charAt(a);
break;
        } //FECHA CASE ','


//###################################################################
//###################################################################
//###################################################################
        default: {
            auxE=auxE.concat(auxD.substring(a, a+1));
            a++;

        }//FECHA DEFAULT

    } //FECHA SWITCH
                    if(a<=codigo.length()-1)auxOn = codigo.charAt(a);
            System.out.println("auxE default: " + auxE);
    } // FECHA WHILE

               if(a<=codigo.length()-1)auxE=auxE.concat(auxD.substring(a, a+1));
    //futuramente será o código de fechamento de chave do main!!


    auxE=auxE.concat(" ");
return auxE;
    }

}
